<?php
/*
 * Класс производящий валидацию полей формы. Использует конфиг полей, где указано как именно валидировать.
 *
 * Created on 21.05.2008
 * @author Alexander Sibiryakov
 */
class FormValidator {
	private $config;
	private $values;
	private $errors = array();
	
	/*
	 * Конфиг может быть таким: 
	 * 		$val_config = array(
			"title"=>array("validators"=>array("length", "isPresent", "notEmpty"), "validator_params"=>array("max_len"=>30)),
			"url"=>array("validators"=>array("isReserved", "isPresent", "Url", "notEmpty")),
			"feed"=>array("validators"=>array("isPresent", "notEmpty")),
			"def_doctype"=>array("validators"=>array("isPresent")),
			"tags"=>array("validators"=>array("isPresent")),
			);
	 *
	 *
	 */
	public function __construct($config) {
		$this->config = $config;
	}
	
	public function setData($data) {
		$this->values = $data;
	}
	
	public function process() {
		foreach($this->config as $name=>$val_config) {
			$config = $val_config["validator_params"];
			$value = $this->values[$name];
			
			foreach ($val_config["validators"] as $validators) {
				$v_name = "val_".$validators;
				$this->$v_name($config, $value, $name); 
			}
		}
	}
	
	/*
	 * Возвращает по каждому полю строку с ошибками возникшими в нем
	 */
	public function getErrors() {
		return $this->errors;
	}
	
	private function addError($name, $error_text) {
		if (isset($this->errors[$name])) $this->errors[$name] .= $error_text; else
			$this->errors[$name] = $error_text;
	}
	
	private function val_isPresent($config, $val, $name) {
		if (isset($val)) { return true; } else {
			$this->addError($name, "Поле отсутствует в запросе. "); 
			return false;
		}
	}
	
	private function val_length($config, $val, $name) {
		if (mb_strlen($val) > $config["max_len"]) {$this->addError($name, "Длина введенной строки превышает допустимое значение."); return false;}
		return true; 
	}
	
	private function val_Url($config, $val, $name) {
		if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_]*$/', $val)) {
			$this->addError($name, "Ошибка в формате URL. ");
			return false;
		}
		return true;
	}
	
	private function val_notEmpty($config, $val, $name) {
		if (empty($val)) {$this->addError($name, "Это поле обязательно к заполнению."); return false;}
		return true;
	}
	
	private function val_isReserved($config, $val , $name) {
			$reserved_words = array(
			// $ cat etc/conf.d/url.php | grep -E "'(path|act)'" | awk '{print $3}'|  sort | uniq | sort
			'ajax',
			'allcommunities',
			'chlogin',
			'comments_submit',
			'createcommunity',
			'createitem',
			'createtdi',
			'css',
			'del',
			'deletecomment',
			'deletecommunity',
			'deleteitem',
			'deletetdi',
			'edit',
			'editcomment',
			'edititem',
			'filestorage',
			'identity',
			'images',
			'imagestorage',
			'initdb',
			'join',
			'js',
			'login',
			'logout',
			'members',
			'profile',
			'showalphabet',
			'showfeed',
			'showfiles',
			'showforum',
			'showgallery',
			'showissue',
			'showissues',
			'test',
			'tmp',
			'tpl',
			'undel',
		);
		if (in_array(trim($val) , $reserved_words)) {$this->addError($name, "Такое значение не допустимо. "); return false;}
		return true;
	}

}
 
?>
